'''
Created on 2017年6月6日

@author: Administrator
'''
'''
第六章（函数）合集：
1.函数文档：函数开头写下的文字
  def xxxx():
      \'''
                    这里的文字,称为函数文档字符串。 
      \'''
  功能跟普通注释差不多，但是可以通过特殊属性调用， xxxx.__doc__  
2.关键字参数：普通的参数叫位置参数，关键字参数就是在传入实参时指定形式参数变量名。  
3.默认参数：将变量赋予初值，可以直接调用方法而不用指定参数。
4.收集参数：函数作者也不知道该方法有多少个参数
         !!注意事项：在使用 收集参数时候，若后面还有其他类型参数，在使用时，
                                                需使用关键字关键字参数，否则python会把你的实参当做收集参数一股脑打包到一起，
                                                如果参数中带有收集参数，可将其他参数设置为默认参数。避免出错。
5.浅谈'*'号作用：*既可以打包又可以解包，一个元组或列表类型需要解包后进行使用否则报错。
6.函数和过程：一般认为函数（function）是有返回值的，过程(procedure)是简单，特殊没有返回值的
                            严格来说 python 只有函数没有返回值
7.函数变量作用域：local variable 局部变量 global variable 全局变量 
              python 在运行函数的时候，使用stack进行存储，当函数 使用完成函数中
                                    所有的数据都被自动删除，所以函数外边是无法访问到函数内部的值
  在函数中，可以肆无忌惮的访问一个全局变量，但是直接修改那么会出现问题。
 原因：如果在函数内部试图修改global variable的值，那么python为了保护全局变量（python屏蔽'shadowing'机制），
             会创建一个新的局部变量进行替代（名字 跟全局变量相同）但真正全局变量值一点没动
强烈建议，不要再成员变量中修改全局变量 的值，如果秉承'虚心接受，死性不改'原则，必须修改，那么可以使用global关键字
8.内嵌函数
'''
def exChangeRate(dollar):
    '''
            函数文档字符串     
    '''
    return dollar*6.5
'''
测试关键字参数
'''
def saySomething(name,word):
    return(name+'->'+word)
'''
测试默认参数
'''
def DoDefaultParameter(name='帅泽',word='也用技术改变世界'):
    return name+'->'+word
'''
测试收集参数  测试*作用
'''
def DoText(* params):
    print("有  %d 个参数" % len(params))
    print("第2个参数是：",params[1]) #通过下标进行访问

'''
测试python只有函数
'''
def Hello():
    print('Hello~')




if __name__ == '__main__':
    print(exChangeRate.__doc__)
    help(exChangeRate)
    '''
            测试关键字参数
    '''
    print(saySomething('马神', '用技术改变世界'))
    print(saySomething('用技术改变世界', '马神'))
    print(saySomething(word='用技术改变世界', name='马神'))
    '''
            测试默认参数
    '''
    print(DoDefaultParameter())
    print(DoDefaultParameter(name='神州帅王',word='用技术改变世界，too'))
    '''
            测试收集参数
    '''
    DoText('i','l','o','v','e','p','y','t','h','o','n')
    '''#报错  因为temp没有解包操作
    temp=[1,3,5,7,9,11,13,15,17,19]
    #解包可理解为一个对象 打碎成多个对象进行存储。
    DoText(temp)
    '''
    temp=[1,3,5,7,9,11,13,15,17,19]
    DoText(*temp)
    '''
            测试python只有函数没有过程:不写返回值 默认返回null
    '''
    print(Hello())